package sensor

import (
	"fmt"
	"log"
	"time"
)

// LevelParser 液位传感器解析器
type LevelParser struct {
	expectedLength int
}

func NewLevelParser(dataLength int) *LevelParser {
	return &LevelParser{
		expectedLength: dataLength, // 应该是9字节
	}
}

func (p *LevelParser) Validate(data []byte) bool {
	if len(data) != p.expectedLength {
		log.Printf("液位传感器数据长度错误: 期望%d字节, 实际%d字节", p.expectedLength, len(data))
		return false
	}

	// 检查帧头是否为0xAA
	if data[0] != 0xAA {
		log.Printf("液位传感器帧头错误: 期望0xAA, 实际0x%X", data[0])
		return false
	}

	// 检查帧尾是否为0xBB
	if data[8] != 0xBB {
		log.Printf("液位传感器帧尾错误: 期望0xBB, 实际0x%X", data[8])
		log.Printf("液位传感器完整数据帧: %02X %02X %02X %02X %02X %02X %02X %02X %02X",
			data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8])
		// 检查是否是数据帧不完整的情况
		if len(data) < 9 {
			log.Printf("警告: 数据帧长度不足，可能数据未完全接收")
		}
		return false
	}

	// 计算校验和: 校验位之前的所有字节和（索引0-6）
	calculatedChecksum := byte(0)
	for i := 0; i < 7; i++ { // 帧头到温度（索引0-6）
		calculatedChecksum += data[i]
	}

	actualChecksum := data[7] // 索引7是校验和

	if calculatedChecksum != actualChecksum {
		log.Printf("液位传感器校验和错误: 计算值0x%X, 实际值0x%X", calculatedChecksum, actualChecksum)
		log.Printf("详细计算: 字节[0-6]和=0x%X", calculatedChecksum)
		return false
	}

	//log.Printf("液位传感器校验和正确: 0x%X", calculatedChecksum)
	return true
}

func (p *LevelParser) Parse(data []byte) (*SensorData, error) {
	if !p.Validate(data) {
		return nil, fmt.Errorf("invalid level data format")
	}

	// 解析数据量: 第5-6字节（索引4-5），高字节在前
	dataHigh := uint16(data[4]) // 数据量高字节
	dataLow := uint16(data[5])  // 数据量低字节
	dataValue := dataHigh*256 + dataLow

	// 解析温度: 第7字节（索引6），不管，忽略

	// 单位转换：根据传感器规格，data_value 的单位是 0.01mm
	// 传感器量程：0-16cm = 0-160mm
	// 例如：data_value = 3850 表示 38.50mm
	liquidLevelMm := float64(dataValue) / 100.0

	// 调试日志（已关闭）
	// log.Printf("液位传感器原始数据: 完整帧=%02X %02X %02X %02X %02X %02X %02X %02X %02X",
	// 	data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8])
	// log.Printf("液位传感器解析: dataHigh=0x%02X(%d), dataLow=0x%02X(%d), dataValue=%d, 液位=%.2f mm",
	// 	dataHigh, dataHigh, dataLow, dataLow, dataValue, liquidLevelMm)

	return &SensorData{
		SensorType: "level",
		Values: map[string]interface{}{
			"data_value":   dataValue,     // 原始数据量值（0.01mm单位）
			"liquid_level": liquidLevelMm, // 液位值（mm），已转换
			"data_high":    data[4],       // 数据量高字节
			"data_low":     data[5],       // 数据量低字节
			"temperature":  data[6],       // 温度值（忽略）
			"frame_header": data[0],       // 帧头
			"frame_length": data[1],       // 长度
			"address":      data[2],       // 地址
			"function":     data[3],       // 功能
			"checksum":     data[7],       // 校验和
			"frame_tail":   data[8],       // 帧尾
		},
		RawData:   fmt.Sprintf("%X", data),
		Timestamp: time.Now(),
	}, nil
}
